freeslot("MT_CRABBUMPER", "MT_CRABBUMPER_AIM", "MT_CRABBUMPER_GLASS", "MT_CRABBUMPER_GLASS_AIM", "MT_CRABBUMPER_EGGBUMP", "MT_CRABBUMPER_EGGBUMP_AIM")

local function CrabRadius(mo)
	if mo.target
	and mo.target.valid
	local target = mo.target
		if R_PointToDist2(mo.x, mo.y, target.x, target.y) <= 512*FRACUNIT
		and not mo.cooldown
		and not mo.rotatefinish
		and not mo.playersaw
		mo.playersaw = true
		mo.speedtime = 3*TICRATE
		end
		if mo.playersaw
			if mo.speedtime > 0
			mo.speedtime = $1 - 1
			P_SpawnGhostMobj(mo.bumper)
				if mo.altangle
					if mo.speedup > -ANG10
					mo.speedup = $1 - ANG1
					end
				else
					if mo.speedup < ANG10
					mo.speedup = $1 + ANG1
					end
				end
			mo.spinangle = $1 + mo.speedup
			elseif mo.speedtime <= 0
			mo.cooldown = 3*TICRATE
			mo.rotatefinish = true
			mo.playersaw = false
			end
		else
			if mo.rotatefinish == true
				if mo.cooldown > 0
				mo.cooldown = $1 - 1
					if mo.altangle
						if mo.speedup < FixedAngle(4*FRACUNIT)
						mo.speedup = $1 + ANG1
						end
					else
						if mo.speedup > -FixedAngle(4*FRACUNIT)
						mo.speedup = $1 - ANG1
						end
					end
				mo.spinangle = $1 + mo.speedup
				elseif mo.cooldown <= 0
					if mo.altangle
					mo.altangle = false
					//mo.speedup = ANG10
					mo.speedup = FixedAngle(14*FRACUNIT)
					else
					mo.altangle = true
					//mo.speedup = -ANG10
					mo.speedup = -FixedAngle(14*FRACUNIT)
					end
				mo.speedtime = 3*TICRATE
				mo.speedup = $1 * -1
				mo.rotatefinish = false
				mo.playersaw = false
				end
			else
				if mo.speedup > 0
				mo.speedup = $1 - ANG1
				elseif mo.speedup < 0
				mo.speedup = $1 + ANG1
				end
				if mo.speedup != 0
				mo.spinangle = $1 + mo.speedup
				end
			mo.playersaw = false
			end
		end
	end
end

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER
		if mo.health
		A_FindTarget(mo, MT_PLAYER, 0)
			if mo.altangle == nil
			mo.altangle = false
			end
			/*if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
				mo.altangle = true
				end
			end*/
			if mo.spinangle == nil
			mo.spinangle = 0
			end
			if mo.playersaw == nil
			mo.playersaw = false
			end
			if mo.speedup == nil
			mo.speedup = 0
			end
			if mo.speedtime == nil
			mo.speedtime = 3*TICRATE
			end
			if mo.cooldown == nil
			mo.cooldown = 0
			end
			if mo.rotatefinish == nil
			mo.rotatefinish = false
			end
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, MT_BUMPER)
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 0
			elseif mo.bumper
			and mo.bumper.valid
			local spinx = mo.x+FixedMul(cos(mo.spinangle), mo.radius*3)
			local spiny = mo.y+FixedMul(sin(mo.spinangle), mo.radius*3)
			//P_TryMove(mo.bumper, spinx, spiny)
			P_InstaThrust(mo.bumper, R_PointToAngle2(mo.bumper.x, mo.bumper.y, spinx, spiny), R_PointToDist2(mo.bumper.x, mo.bumper.y, spinx, spiny))
			mo.bumper.momz = 0
			CrabRadius(mo)
				if mo.playersaw
				mo.bumper.info.mass = 32*FRACUNIT
				else
				mo.bumper.info.mass = 16*FRACUNIT
				end
				if (mo.eflags & MFE_VERTICALFLIP)
				mo.bumper.eflags = $1|MFE_VERTICALFLIP
				mo.bumper.z = mo.z-mo.height/2
				else
				mo.bumper.z = mo.z+mo.height/2
				end
				if mo.altangle
				mo.spinangle = $1 - FixedAngle(10*FRACUNIT)
				else
				mo.spinangle = $1 + FixedAngle(10*FRACUNIT)
				end
			elseif mo.bumper
			and not mo.bumper.valid
			mo.bumper = nil
			end
			if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
					if mo.bumper2 == nil
					mo.bumper2 = P_SpawnMobj(mo.x, mo.y, mo.z, MT_BUMPER)
					mo.bumper2.flags = $1|MF_SLIDEME
					mo.bumper2.reactiontime = 0
					elseif mo.bumper2
					and mo.bumper2.valid
					local spinx = mo.x+FixedMul(cos(mo.spinangle+ANGLE_180), mo.radius*3)
					local spiny = mo.y+FixedMul(sin(mo.spinangle+ANGLE_180), mo.radius*3)
					//P_TryMove(mo.bumper, spinx, spiny)
					P_InstaThrust(mo.bumper2, R_PointToAngle2(mo.bumper2.x, mo.bumper2.y, spinx, spiny), R_PointToDist2(mo.bumper2.x, mo.bumper2.y, spinx, spiny))
					mo.bumper2.momz = 0
						if mo.playersaw
						P_SpawnGhostMobj(mo.bumper2)
						mo.bumper2.info.mass = 32*FRACUNIT
						else
						mo.bumper2.info.mass = 16*FRACUNIT
						end
						if (mo.eflags & MFE_VERTICALFLIP)
						mo.bumper2.eflags = $1|MFE_VERTICALFLIP
						mo.bumper2.z = mo.z-mo.height/2
						else
						mo.bumper2.z = mo.z+mo.height/2
						end
					elseif mo.bumper2
					and not mo.bumper2.valid
					mo.bumper2 = nil
					end
				end
			end
		else
			if mo.bumper
			and mo.bumper.valid
			mo.bumper.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper.state = S_XPLD1
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
			if mo.bumper2
			and mo.bumper2.valid
			mo.bumper2.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper2.state = S_XPLD1
			mo.bumper2.momx = 0
			mo.bumper2.momy = 0
			mo.bumper2.momz = 0
			mo.bumper2 = nil
			end
		end
	end
end, MT_CRABBUMPER)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER_AIM
		if mo.health
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, MT_BUMPER)
			mo.bumper.tracer = mo
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 0
			elseif mo.bumper
			and mo.bumper.valid
			mo.bumper.info.speed = 300
			A_CrushclawAim(mo.bumper, 64, 16)
			elseif mo.bumper
			and not mo.bumper.valid
			mo.bumper = nil
			end
		else
			if mo.bumper
			and mo.bumper.valid
			mo.bumper.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper.state = S_XPLD1
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
		end
	end
end, MT_CRABBUMPER_AIM)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER_GLASS
		if mo.health
		A_FindTarget(mo, MT_PLAYER, 0)
		local spawnbumper
			if mo.spawnpoint
			and mo.spawnpoint.valid
				if mo.spawnpoint.extrainfo == 0 //Standart Bumper
				spawnbumper = MT_GLASSBUMPER
				elseif mo.spawnpoint.extrainfo == 1 //Past Version
				spawnbumper = MT_GLASSBUMPER_PAST
				elseif mo.spawnpoint.extrainfo == 2 //Good Future Version
				spawnbumper = MT_GLASSBUMPER_GOODFUTURE
				elseif mo.spawnpoint.extrainfo == 3 //Bad Future Version
				spawnbumper = MT_GLASSBUMPER_BADFUTURE
				else //If Something not equal upper, then using standart bumper
				spawnbumper = MT_GLASSBUMPER
				end
			else //No Spawnpoint? then standart bumper
			spawnbumper = MT_GLASSBUMPER
			end
			if mo.altangle == nil
			mo.altangle = false
			end
			/*if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
				mo.altangle = true
				end
			end*/
			if mo.spinangle == nil
			mo.spinangle = 0
			end
			if mo.playersaw == nil
			mo.playersaw = false
			end
			if mo.speedup == nil
			mo.speedup = 0
			end
			if mo.speedtime == nil
			mo.speedtime = 3*TICRATE
			end
			if mo.cooldown == nil
			mo.cooldown = 0
			end
			if mo.rotatefinish == nil
			mo.rotatefinish = false
			end
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, spawnbumper)
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 1
			elseif mo.bumper
			and mo.bumper.valid
			local spinx = mo.x+FixedMul(cos(mo.spinangle), mo.radius*3)
			local spiny = mo.y+FixedMul(sin(mo.spinangle), mo.radius*3)
			//P_TryMove(mo.bumper, spinx, spiny)
			P_InstaThrust(mo.bumper, R_PointToAngle2(mo.bumper.x, mo.bumper.y, spinx, spiny), R_PointToDist2(mo.bumper.x, mo.bumper.y, spinx, spiny))
			mo.bumper.momz = 0
			CrabRadius(mo)
				if mo.playersaw
				mo.bumper.info.mass = 32*FRACUNIT
				else
				mo.bumper.info.mass = 16*FRACUNIT
				end
				if (mo.eflags & MFE_VERTICALFLIP)
				mo.bumper.eflags = $1|MFE_VERTICALFLIP
				mo.bumper.z = mo.z-mo.height/2
				else
				mo.bumper.z = mo.z+mo.height/2
				end
				if mo.altangle
				mo.spinangle = $1 - FixedAngle(10*FRACUNIT)
				else
				mo.spinangle = $1 + FixedAngle(10*FRACUNIT)
				end
			end
			if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
					if mo.bumper2 == nil
					mo.bumper2 = P_SpawnMobj(mo.x, mo.y, mo.z, spawnbumper)
					mo.bumper2.flags = $1|MF_SLIDEME
					mo.bumper2.reactiontime = 1
					elseif mo.bumper2
					and mo.bumper2.valid
					local spinx = mo.x+FixedMul(cos(mo.spinangle+ANGLE_180), mo.radius*3)
					local spiny = mo.y+FixedMul(sin(mo.spinangle+ANGLE_180), mo.radius*3)
					//P_TryMove(mo.bumper, spinx, spiny)
					P_InstaThrust(mo.bumper2, R_PointToAngle2(mo.bumper2.x, mo.bumper2.y, spinx, spiny), R_PointToDist2(mo.bumper2.x, mo.bumper2.y, spinx, spiny))
					mo.bumper2.momz = 0
						if mo.playersaw
						P_SpawnGhostMobj(mo.bumper2)
						mo.bumper2.info.mass = 32*FRACUNIT
						else
						mo.bumper2.info.mass = 16*FRACUNIT
						end
						if (mo.eflags & MFE_VERTICALFLIP)
						mo.bumper2.eflags = $1|MFE_VERTICALFLIP
						mo.bumper2.z = mo.z-mo.height/2
						else
						mo.bumper2.z = mo.z+mo.height/2
						end
						if not (mo.bumper and mo.bumper.valid)
							if mo.altangle
							mo.spinangle = $1 - FixedAngle(10*FRACUNIT)
							else
							mo.spinangle = $1 + FixedAngle(10*FRACUNIT)
							end
						end
					end
				end
			end
		else
			if mo.bumper
			and mo.bumper.valid
			P_KillMobj(mo.bumper)
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
			if mo.bumper2
			and mo.bumper2.valid
			P_KillMobj(mo.bumper2)
			mo.bumper2.momx = 0
			mo.bumper2.momy = 0
			mo.bumper2.momz = 0
			mo.bumper2 = nil
			end
		end
	end
end, MT_CRABBUMPER_GLASS)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER_GLASS_AIM
		if mo.health
		local spawnbumper
			if mo.spawnpoint
			and mo.spawnpoint.valid
				if mo.spawnpoint.extrainfo == 0 //Standart Bumper
				spawnbumper = MT_GLASSBUMPER
				elseif mo.spawnpoint.extrainfo == 1 //Past Version
				spawnbumper = MT_GLASSBUMPER_PAST
				elseif mo.spawnpoint.extrainfo == 2 //Good Future Version
				spawnbumper = MT_GLASSBUMPER_GOODFUTURE
				elseif mo.spawnpoint.extrainfo == 3 //Bad Future Version
				spawnbumper = MT_GLASSBUMPER_BADFUTURE
				else //If Something not equal upper, then using standart bumper
				spawnbumper = MT_GLASSBUMPER
				end
			else //No Spawnpoint? then standart bumper
			spawnbumper = MT_GLASSBUMPER
			end
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, spawnbumper)
			mo.bumper.tracer = mo
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 0
			elseif mo.bumper
			and mo.bumper.valid
			mo.bumper.info.speed = 300
			A_CrushclawAim(mo.bumper, 64, 16)
			end
		else
			if mo.bumper
			and mo.bumper.valid
			mo.bumper.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper.state = S_XPLD1
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
		end
	end
end, MT_CRABBUMPER_GLASS_AIM)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER_EGGBUMP
		if mo.health
		A_FindTarget(mo, MT_PLAYER, 0)
			if mo.altangle == nil
			mo.altangle = false
			end
			/*if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
				mo.altangle = true
				end
			end*/
			if mo.spinangle == nil
			mo.spinangle = 0
			end
			if mo.playersaw == nil
			mo.playersaw = false
			end
			if mo.speedup == nil
			mo.speedup = 0
			end
			if mo.speedtime == nil
			mo.speedtime = 3*TICRATE
			end
			if mo.cooldown == nil
			mo.cooldown = 0
			end
			if mo.rotatefinish == nil
			mo.rotatefinish = false
			end
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, MT_EGGMANBUMPER)
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 0
			elseif mo.bumper
			and mo.bumper.valid
			local spinx = mo.x+FixedMul(cos(mo.spinangle), mo.radius*3)
			local spiny = mo.y+FixedMul(sin(mo.spinangle), mo.radius*3)
			//P_TryMove(mo.bumper, spinx, spiny)
			P_InstaThrust(mo.bumper, R_PointToAngle2(mo.bumper.x, mo.bumper.y, spinx, spiny), R_PointToDist2(mo.bumper.x, mo.bumper.y, spinx, spiny))
			mo.bumper.momz = 0
			CrabRadius(mo)
				if mo.playersaw
				mo.bumper.info.mass = 32*FRACUNIT
				else
				mo.bumper.info.mass = 16*FRACUNIT
				end
				if (mo.eflags & MFE_VERTICALFLIP)
				mo.bumper.eflags = $1|MFE_VERTICALFLIP
				mo.bumper.z = mo.z-mo.height/2
				else
				mo.bumper.z = mo.z+mo.height/2
				end
				if mo.altangle
				mo.spinangle = $1 - FixedAngle(10*FRACUNIT)
				else
				mo.spinangle = $1 + FixedAngle(10*FRACUNIT)
				end
			elseif mo.bumper
			and not mo.bumper.valid
			mo.bumper = nil
			end
			if mo.spawnpoint
				if mo.spawnpoint.options & MTF_OBJECTSPECIAL
					if mo.bumper2 == nil
					mo.bumper2 = P_SpawnMobj(mo.x, mo.y, mo.z, MT_EGGMANBUMPER)
					mo.bumper2.flags = $1|MF_SLIDEME
					mo.bumper2.reactiontime = 0
					elseif mo.bumper2
					and mo.bumper2.valid
					local spinx = mo.x+FixedMul(cos(mo.spinangle+ANGLE_180), mo.radius*3)
					local spiny = mo.y+FixedMul(sin(mo.spinangle+ANGLE_180), mo.radius*3)
					//P_TryMove(mo.bumper, spinx, spiny)
					P_InstaThrust(mo.bumper2, R_PointToAngle2(mo.bumper2.x, mo.bumper2.y, spinx, spiny), R_PointToDist2(mo.bumper2.x, mo.bumper2.y, spinx, spiny))
					mo.bumper2.momz = 0
						if mo.playersaw
						P_SpawnGhostMobj(mo.bumper2)
						mo.bumper2.info.mass = 32*FRACUNIT
						else
						mo.bumper2.info.mass = 16*FRACUNIT
						end
						if (mo.eflags & MFE_VERTICALFLIP)
						mo.bumper2.eflags = $1|MFE_VERTICALFLIP
						mo.bumper2.z = mo.z-mo.height/2
						else
						mo.bumper2.z = mo.z+mo.height/2
						end
					elseif mo.bumper2
					and not mo.bumper2.valid
					mo.bumper2 = nil
					end
				end
			end
		else
			if mo.bumper
			and mo.bumper.valid
			mo.bumper.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper.state = S_XPLD1
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
			if mo.bumper2
			and mo.bumper2.valid
			mo.bumper2.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper2.state = S_XPLD1
			mo.bumper2.momx = 0
			mo.bumper2.momy = 0
			mo.bumper2.momz = 0
			mo.bumper2 = nil
			end
		end
	end
end, MT_CRABBUMPER_EGGBUMP)

addHook("MobjThinker", function(mo)
	if mo
	and mo.valid
	and mo.type == MT_CRABBUMPER_EGGBUMP_AIM
		if mo.health
			if mo.bumper == nil
			mo.bumper = P_SpawnMobj(mo.x, mo.y, mo.z, MT_EGGMANBUMPER)
			mo.bumper.tracer = mo
			mo.bumper.flags = $1|MF_SLIDEME
			mo.bumper.reactiontime = 0
			elseif mo.bumper
			and mo.bumper.valid
			mo.bumper.info.speed = 300
			A_CrushclawAim(mo.bumper, 64, 16)
			elseif mo.bumper
			and not mo.bumper.valid
			mo.bumper = nil
			end
		else
			if mo.bumper
			and mo.bumper.valid
			mo.bumper.flags = MF_SCENERY|MF_NOGRAVITY
			mo.bumper.state = S_XPLD1
			mo.bumper.momx = 0
			mo.bumper.momy = 0
			mo.bumper.momz = 0
			mo.bumper = nil
			end
		end
	end
end, MT_CRABBUMPER_EGGBUMP_AIM)